tg-me.com/python_job_interview/1113
Last Update:
🐍 Хитрая задача на замыкания в Python
🔹 Уровень: Advanced
🔹 Темы: замыкания (closures), переменные цикла, lambda
, отложенное выполнение
📌 Условие
Что выведет следующий код?
funcs = []
for i in range(5):
funcs.append(lambda: i)
results = [f() for f in funcs]
print(results)
❓ Вопросы
1. Почему вывод может не соответствовать ожиданиям
[0, 1, 2, 3, 4]
? 2. Что именно "запоминает"
lambda
внутри цикла? 3. Как переписать код, чтобы результат был
[0, 1, 2, 3, 4]
?🔍 Разбор
✅ Ожидаемый (неправильный) вывод:
[4, 4, 4, 4, 4]
🔧 Почему так происходит
- Все
lambda
внутри funcs
замыкают одну и ту же переменную `i`. - К моменту выполнения
f()
переменная i
уже равна 4 — и так для всех функций.⚠️ Подвох
lambda: i
не захватывает значение, а ссылается на переменную, которая будет изменяться при каждой итерации цикла. В итоге — все
lambda
ссылаются на одно и то же `i`, которое стало равно 4 к концу цикла.🧠 Решение
Нужно "зафиксировать" значение
i
, передав его как аргумент по умолчанию в lambda
:
for i in range(5):
funcs.append(lambda i=i: i)
Теперь результат будет:
[0, 1, 2, 3, 4]
📌 Это один из самых частых подвохов в Python, особенно при использовании лямбда-функций в генераторах и UI-коллбеках.
BY Python вопросы с собеседований
Warning: Undefined variable $i in /var/www/tg-me/post.php on line 283
Share with your friend now:
tg-me.com/python_job_interview/1113